﻿<!DOCTYPE html>
<html>

<head lang="en">
    <meta charset="UTF-8">
    <title>注册</title>
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport"
          content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
    <meta name="format-detection" content="telephone=no">
    <meta name="renderer" content="webkit">
    <meta http-equiv="Cache-Control" content="no-siteapp"/>

    <link rel="stylesheet" href="./AmazeUI-2.4.2/assets/css/amazeui.min.css"/>
    <link href="./css/dlstyle.css" rel="stylesheet" type="text/css">
    <script src="./AmazeUI-2.4.2/assets/js/jquery.min.js"></script>
    <script src="./AmazeUI-2.4.2/assets/js/amazeui.min.js"></script>
<!--集成axios和vue-->
    <!--引入vue和axios-->
    <script src="js/plugins/vue/dist/vue.js"></script>
    <script src="js/plugins/axios/dist/axios.js"></script>
    <!--全局属性和基础路径-->
    <script src="js/common.js"></script>

</head>

<body>
<div id="app">
<div class="login-boxtitle">
    <a href="home/demo.html"><img alt="" src="./images/logobig.png"/></a>
</div>

<div class="res-banner">
    <div class="res-main">
        <div class="login-banner-bg"><span></span><img src="./images/big.jpg"/></div>
        <div class="login-box">
            <div class="am-tabs" id="doc-my-tabs">
                <ul class="am-tabs-nav am-nav am-nav-tabs am-nav-justify">
                    <!--class="am-active"默认先显示邮箱注册页面-->
                    <li class="am-active"><a href="">邮箱注册</a></li>
                    <li><a href="">手机号注册</a></li>
                </ul>

                <div class="am-tabs-bd">
                    <!--邮箱注册-->
                    <div class="am-tab-panel am-active">
                        <form method="post">
                            <div class="user-email">
                                <label for="email"><i class="am-icon-envelope-o"></i></label>
                                <input type="email" name="" id="email" v-model="emailUserForm.email" placeholder="请输入邮箱账号">
                            </div>
                            <div class="user-pass">
                                <label for="password"><i class="am-icon-lock"></i></label>
                                <input type="password" name="" id="password" v-model="emailUserForm.pwd" placeholder="设置密码">
                            </div>
                            <div class="user-pass">
                                <label for="passwordRepeat"><i class="am-icon-lock"></i></label>
                                <input type="password" name="" id="passwordRepeat" v-model="emailUserForm.rePwd" placeholder="确认密码">
                            </div>

                        </form>

                        <div class="login-links">
                            <label for="reader-me">
                                <input id="reader-me" type="checkbox"> 点击表示您同意商城《服务协议》
                            </label>
                        </div>
                        <div class="am-cf">
                            <input type="button" name="" value="注册" @click="registerEmail" class="am-btn am-btn-primary am-btn-sm am-fl">
                        </div>

                    </div>
                    <!--手机号注册-->
                    <div class="am-tab-panel">
                        <form method="post">
                            <div class="user-phone">
                                <label for="phone"><i class="am-icon-mobile-phone am-icon-md"></i></label>
                                <input type="tel" name="" id="phone" v-model="phoneUserForm.phone" placeholder="请输入手机号">
                            </div>
                            <!--验证码-->
                            <div class="user-phone">
                                <label for="imageCode"><i class="am-icon-check am-icon-sm"></i></label>
                                <input type="text" name="" style="width: 180px;" v-model="phoneUserForm.imageCode" id="imageCode" placeholder="请输入图片验证码">
                                <img id="captcha-image-temp" @click="getImageCode":src="base64ImageCode"  class="captcha-image-temp"  alt="点击换图" title="点击换图" style="vertical-align: middle; cursor: pointer;">
                            </div>
                            <div class="verification">
                                <label for="code"><i class="am-icon-code-fork"></i></label>
                                <input type="tel" name="" id="code" v-model="phoneUserForm.phoneCode" placeholder="请输入验证码">
                                <!--sendMobileCode(this)这里可以传this，将当前按钮对象传递过去，就不用在方法那里通过目标对象获取按钮了-->
                                <!--vue实例中定义单击事件的方法@click-->
                                <button type="button" id="dyMobileButton" @click="sendMobileCode();">获取</button>
                            </div>
                            <div class="user-pass">
                                <label for="password"><i class="am-icon-lock"></i></label>
                                <input type="password" name="" id="password" v-model="phoneUserForm.pwd" placeholder="设置密码">
                            </div>
                            <div class="user-pass">
                                <label for="passwordRepeat"><i class="am-icon-lock"></i></label>
                                <input type="password" name="" id="passwordRepeat" v-model="phoneUserForm.rePwd" placeholder="确认密码">
                            </div>
                        </form>
                        <div class="login-links">
                            <label for="reader-me">
                                <input id="reader-me" type="checkbox"> 点击表示您同意商城《服务协议》
                            </label>
                        </div>
                        <div class="am-cf">
                            <!--type="submit"点击，就提交表单了，而我们要通过发送异步请求的方式,所以改成button-->
                            <input type="button" name="" value="注册" @click="phoneRegister" class="am-btn am-btn-primary am-btn-sm am-fl">
                        </div>

                        <hr>
                    </div>



                </div>
            </div>
        </div>
    </div>

    <div class="footer ">
        <div class="footer-hd ">
            <p>
                <a href="# ">恒望科技</a>
                <b>|</b>
                <a href="# ">商城首页</a>
                <b>|</b>
                <a href="# ">支付宝</a>
                <b>|</b>
                <a href="# ">物流</a>
            </p>
        </div>
        <div class="footer-bd ">
            <p>
                <a href="# ">关于恒望</a>
                <a href="# ">合作伙伴</a>
                <a href="# ">联系我们</a>
                <a href="# ">网站地图</a>
                <em>© 2015-2025 Hengwang.com 版权所有. 更多模板 <a href="http://www.cssmoban.com/" target="_blank" title="模板之家">模板之家</a>
                    - Collect from <a href="http://www.cssmoban.com/" title="网页模板" target="_blank">网页模板</a></em>
            </p>
        </div>
    </div>
</div>
</div>
<script>
    $(function () {
        $('#doc-my-tabs').tabs();
    })
</script>
<script type="text/javascript">
    new Vue({
        //将Vue实例挂载到id为app的元素上
        el:"#app",//挂载之后，这个vue实例内部的模型数据和方法才能使用
        data:{
            phoneUserForm:{//手机注册
                imageCode:'',//图形验证码
                phone:'18982322687',//手机号 - 用来v-model做了双向绑定
                phoneCode:'',
                pwd:'',//传递到后端的数据需要做双向绑定
                rePwd:''//前端得到页面中输入的数据，一定要进行双向绑定
            },
            emailUserForm:{//邮箱注册
                email:'',
                pwd:'',//传递到后端的数据需要做双向绑定
                rePwd:''//前端得到页面中输入的数据，一定要进行双向绑定
            },
            base64ImageCode:'',//图形验证码安装base64进行编码
        },
        methods:{
            //邮箱注册
            registerEmail(){
                this.$http.post("/user/register/email",this.emailUserForm).then(res=>{
                    if (res.data.success){
                        //注册成功跳转到登录页面
                        location.href="login.html";
                    }else {
                        alert(res.data.msg);//弹框出错误信息
                    }
                }).catch(res=>{
                    alert("系统繁忙，请稍后重试！[400,404,405]");//400：前后端传递的参数类型不一致
                    //404:请求资源没找到
                    //405:请求方式前后端不一致
                })
            },

            //手机号注册
            phoneRegister(){
                this.$http.post("/user/register/phone",this.phoneUserForm).then(res=>{
                    if (res.data.success){//注册成功跳转到登录页面去登录
                        //注册成功 - 跳转到登录页面
                        location.href = "login.html";
                    }else{//注册失败打印错误信息-异步请求当前页面不会销毁，就在当前页面
                        alert(res.data.msg);//业务异常的信息
                    }
                }).catch(res=>{
                    alert("系统繁忙，请稍后重试！[400,404,405]");//400：前后端传递的参数类型不一致
                    //404:请求资源没找到
                    //405:请求方式前后端不一致
                })
            },

            //获取图形验证码
            getImageCode(){
                //js中可以直接对变量进行判断：null，''，undefined，0，false等都是false
                //从localStorage中去获取imageCodeKey的值
                let key = localStorage.getItem("imageCodeKey");
               //如果 没有 就重新生成【保证key值唯一】
                if(!key){//js中独特的写法.若为false-空的，就执行代码块中的内容
                    key = this.createUuid();
                    //保存在localStorage中的数据要删除掉：方式1.removeItem  2.手动删除
                    //生成的新的uuid，先前由于值为空，所以要重新设置进去
                    localStorage.setItem("imageCodeKey",key);
                }
                //保证key的值唯一
                    //验证码属于公共模块，所以get请求，请求地址/verifyCode/image/【写两层因为还有手机验证码】
                //key也就是uuid【字符串形式，这里用不了session，因为cookie用不了，它不能跨域】，要随着请求一起携带过去。
                this.$http.get("/verifyCode/image/"+key).then(res=>{//请求成功之后的回调函数
                    //obj来自于AjaxResult里面设置的字段名
                        //base64ImageCode与前端双向绑定，这里赋值改变后，页面上也会改变
                        //res.data固定写法之后，就是AjaxResult中设置的字段obj
                    /*obj也就是base64编码之后，拼接上指定格式字符串形式后，就可以访问相应的图片了，
                    然后赋值给页面中双向绑定对应名字的字段，进行图形验证码的显示*/
                    this.base64ImageCode = "data:image/jpeg;base64,"+res.data.obj;
                })
            },

            //发送手机验证码
            sendMobileCode(){
                //1.判断手机号不为空
                if (!this.phoneUserForm.phone) {
                    alert("手机号不能为空");//this.$message.error消息框是elementui的，这里只用了vue和axios
                    return;
                }
                //2.判断图片验证码不为空
                if (!this.phoneUserForm.imageCode) {
                    alert("图片验证码不能为空");
                    return;
                }
                //3.获取按钮，禁用按钮  发送时灰化不能使用，发送成功倒计时60才能使用，如果发送失败立即可以发送
                var sendBtn = $(event.target);//获取到按钮 - 有$，所以是jQuery对象：方法html(),text() - $(event.target)触发当前事件的目标 - 为了点击按钮之后禁用
                //js对象用innerHtml，和innerText="xxx"。这里是jQuery对象
                sendBtn.attr("disabled", true);//设置属性：disabled="true"

                //组装请求参数 - 发请求传递的这三个参数
                /*后端用对象去接收的方式：--公共模块
                1.数据库对象【domain、entity、pojo等-一般与数据库中表字段对应】
                2.数据传输对象【dto或vo值对象】
                3.Map*/
                var param = {//以对象的方式发送参数
                    phone: this.phoneUserForm.phone,            //手机号码
                    imageCode: this.phoneUserForm.imageCode,    //图形验证码
                    imageCodeKey: localStorage.getItem("imageCodeKey")  //获取redis的图形验证码的key
                };

                //4.发送ajax请求
                this.$http.post("/verifyCode/phone", param).then(res => {
                    var ajaxResult = res.data;
                    if (ajaxResult.success) {
                        alert("手机验证码已经发送到您的手机，请在3分钟内使用");
                        //4.1.发送成：倒计时
                        var time = 60;
                        //周期性定时器
                        var interval = window.setInterval(function () {
                            //每一条倒计时减一
                            time = time - 1;
                            //把倒计时时间搞到按钮上
                            sendBtn.html(time + "s");
                            //4.2.倒计时完成恢复按钮
                            if (time <= 0) {
                                sendBtn.html("重发");
                                sendBtn.attr("disabled", false); //解除禁用
                                //清除定时器
                                window.clearInterval(interval);
                            }
                        }, 1000);
                    } else {
                        //4.3.发送失败：提示，恢复按钮
                        sendBtn.attr("disabled", false);
                        alert(ajaxResult.msg);
                    }
                })
            },

            /**
             * 获取uuid - 用来作为redis的key，value是验证码
             * @returns {string}
             */
            createUuid(){
                var s = [];
                var hexDigits = "0123456789abcdefghi";
                for (var i = 0; i < 36; i++) {
                    s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
                }
                s[14] = "4"; // bits 12-15 of the time_hi_and_version field to 0010
                s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01
                s[8] = s[13] = s[18] = s[23] = "-";

                var uuid = s.join("");
                return uuid;
            },
        },
        mounted(){
            this.getImageCode();
        }
    })
</script>
</body>

</html>